package awt.awt05.game_00;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class PinBall {

    private Frame fr=new Frame();

    // 窗口的宽高
    private final int frWid=300;
    private final int frHei=400;

    //球的大小
    private final int BallSize=16;

    //记录小球的坐标
    private int ballX=120;
    private int ballY=20;

    //记录小球x,y方向上分别移动的速度
    private int speedX=5;
    private int speedY=10;


    //球拍的宽高
    private final int RACKET_WIDTH=60;
    private final int RACKET_HEight=20;

    //记录球拍的坐标
    private int racketX=120;
    private final int racketY=340; // 球拍高度不变

    // 标识当前游戏是否已结束
    private boolean isOver=false;

    // swing提供的Timer
    private Timer timer;

    private class MyCanvas extends Canvas{
        @Override
        public void paint(Graphics g){ // 这是组件里的方法 canvas本身就是组件  Graphics是awt的一个类

            if(isOver){
                // 游戏结束

                // 设置画笔
                g.setColor(Color.blue);
                g.setFont(new Font("Times",Font.BOLD,30));
                g.drawString("游戏结束",50,200);

            }else{
                // 游戏中

                // 绘制小球
                g.setColor(Color.red);
                g.fillOval(ballX,ballY,BallSize,BallSize);

                // 绘制球拍
                g.setColor(Color.pink);
                g.fillRect(racketX,racketY,RACKET_WIDTH,RACKET_HEight);

            }
        }
    }

    MyCanvas drawArea=new MyCanvas();


    public void init(){

        // 完成球拍坐标的变化
        KeyListener listener=new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println(e.getKeyCode());
                int keyCode=e.getKeyCode();
                if(keyCode==KeyEvent.VK_LEFT){
                    if(racketX>0){
                        racketX-=10;
                    }
                }else if(keyCode==KeyEvent.VK_RIGHT){
                    if(racketX<(frWid-RACKET_WIDTH)){
                        racketX+=10;
                    }
                }
            }
        };

        // 给frame和drawArea注册监听器
        fr.addKeyListener(listener);
        drawArea.addKeyListener(listener);


        // 小球坐标的控制
        ActionListener taskFn=new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 根据边界范围 修正速度

                // x轴方向 x小于等于0或者x大于窗口宽度减去小球宽度的距离
                if(ballX<=0||ballX>=(frWid-BallSize)){
                    speedX=-speedX;
                }

                // y轴方向 y小于等于0或者  y大于球拍y减去小球高度的距离 并且 小球x大于球拍的x(球拍左边x值大于小球x值) 并且 小球x小于球拍的x加上球拍的宽度(球拍右边x值大于小球x值)
                // 相当于小球要在球拍上
                if(ballY<=0||(ballY>(racketY-BallSize)&&ballX>racketX&&ballX<(racketX+RACKET_WIDTH))){
                    speedY=-speedY;
                }

                // 小球不在球拍上
                if(ballY>(racketY-BallSize)&&(ballX<racketX||ballX>(racketX+RACKET_WIDTH))){
                    // 停止定时器
                    timer.stop();

                    // 修改游戏是否结束的标记
                    isOver=true;

                    // 重绘界面
                    drawArea.repaint();

                }

                // 更新小球的坐标 重绘界面
                ballX+=speedX;
                ballY+=speedY;
                drawArea.repaint();
            }
        };

        timer=new Timer(100,taskFn);
        timer.start();

        drawArea.setPreferredSize(new Dimension(frWid,frHei));
        fr.add(drawArea);
        fr.pack();
        fr.setVisible(true);
    }


    public static void main(String[] args){
        new PinBall().init();
    }
}
